package br.edu.faculdadeprojecao.si.sisecon.action;

import java.util.List;

import javax.ejb.Stateful;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;

import br.edu.faculdadeprojecao.si.sisecon.manager.EstudanteManager;
import br.edu.faculdadeprojecao.si.sisecon.manager.ManagerException;
import br.edu.faculdadeprojecao.si.sisecon.model.Estudante;

@Named
@ConversationScoped
@Stateful
public class EstudanteAction extends TypedAction<Estudante> {
	
	private static final long serialVersionUID = 1L;

	EstudanteManager estudanteManager;
	
	String cpf;
	
	boolean managed;
	
	public EstudanteAction()
	{}

	@Inject
	public EstudanteAction(final EntityManager em, final EstudanteManager manager) {
		this.estudanteManager = manager;
		this.estudanteManager.setEntityManager(em);
	}
	
	public void load() {
		super.load();

		if (instance == null) {
			instance = new Estudante();
		}
        if (this.cpf != null && !FacesContext.getCurrentInstance().isPostback()) {
            try {
				this.instance = this.estudanteManager.findByCpf(this.cpf);
				this.managed = true;
			} catch (ManagerException e) {
				addMessageError("Error ao carregar o estudante. '"+e.getMessage()+"'");
				e.printStackTrace();
			}
        }
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
	public String salvar() {
		Estudante estudante = getInstance();
		try {
			estudanteManager.salvar(estudante).commit();
			instance = new Estudante();
			addMessageInfo("Estudante salvo com sucesso.");
			endConversation();
			return "/EstudanteList.jsf";
		} catch (ManagerException e) {
			addMessageError("Error ao salvar Estudante.");
			e.printStackTrace();
		}
		return null;
	}
	
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
	public String excluir(final Estudante estudante) {
//		try {
//			setorService.exlcuir(setor);
//			addMessageInfo("Setor excluida com sucesso.");
//			return "/SetorList.jsf";
//		} catch (PersistenceException e) {
//			addMessageError("Error ao excluir Setor.");
//			e.printStackTrace();
//		}
		return null;
	}

	public List<Estudante> getResultList() {
		return estudanteManager.list();
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		if (cpf != null && !cpf.equals(instance.getCpf())) {
			this.cpf = cpf;
            try {
				instance = estudanteManager.findByCpf(cpf);
				managed = true;
			} catch (ManagerException e) {
				addMessageError("Error ao carregar o estudante. '"+e.getMessage()+"'");
				e.printStackTrace();
			}

            if (instance == null) {
                managed = false;
                instance = new Estudante();
                addMessageWarn("Não há estudante com o cpf " + cpf);
            }

            this.beginConversation();
        }
		this.cpf = cpf;
	}

	public boolean isManaged() {
		return managed;
	}

}
